package com.hxzy.service.impl;

import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hxzy.common.consts.RabbitMQConst;
import com.hxzy.dto.SysDictTypeDTO;
import com.hxzy.entity.SysDictType;
import com.hxzy.mapper.SysDictTypeMapper;
import com.hxzy.service.SysDictTypeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

/**
 * 数据字典
 */
@Service
public class SysDictTypeServiceImpl extends ServiceImpl<SysDictTypeMapper, SysDictType> implements SysDictTypeService {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 注入消息队列
     */
  //  @Autowired
   // private RabbitTemplate  rabbitTemplate;

    @Override
    public IPage<SysDictType> selectDictTypeList(SysDictTypeDTO sysDictTypeDTO) {
        IPage<SysDictType> iPage=new PageDTO<SysDictType>(sysDictTypeDTO.getPage(),sysDictTypeDTO.getSize());
        IPage<SysDictType> search =this.baseMapper.search(iPage,sysDictTypeDTO);
        return search;
    }

    /**
     * 更新状态
     * @param dictIds
     * @return
     */
    @Override
    public boolean deleteDictTypeByIds(Long[] dictIds) {
        int count=0;
        for (Long dictId : dictIds){
            //更新状态
            int result=super.baseMapper.updateByState(dictId,"1");
            count+=result;
        }

        //使用消息队列 (生产者)
        Map<String,Object> data=new HashMap<>();
        //删除
        data.put("operation","delete");
        data.put("data",dictIds);
        //手动转json
        String jsonStr=JSONUtil.toJsonStr(data);
        this.sendMessage(jsonStr);



        //这里可以使用  消息队列来解决
//        //先查询id查询到值
//        LambdaQueryWrapper<SysDictType> query=new LambdaQueryWrapper<>();
//        query.in(SysDictType::getDictId,dictIds);
//        query.select(SysDictType::getDictId,SysDictType::getDictType);
//        List<SysDictType> sysDictTypeList = this.baseMapper.selectList(query);
//
//
//        //删除redis中的数据,同步数据
//        List<String> removeRedisKey=new ArrayList<>();
//        for(SysDictType dictType: sysDictTypeList) {
//            String redisKey= RedisConst.getRedisKey(RedisConst.DICT_DATA_KEY,dictType.getDictType());
//            removeRedisKey.add(redisKey);
//        }
//        this.redisTemplate.delete(removeRedisKey);

        return count>0;
    }

    /**
     * 修改
     * @param sysDictType  本次要修改的
     * @param dbDict 数据库的值
     * @return
     */
    @Override
    public boolean updateDict(SysDictType sysDictType, SysDictType dbDict) {
        //更新数据库
         boolean result= this.updateById(sysDictType);
         if(result){

             // 同步redis的缓存
             Map<String,Object> data=new HashMap<>();
             //判断当前状态state=?  如果==1  二话不说，把redis中的key删除
             if(sysDictType.getStatus().equals("1")){
                 data.put("operation","delete");
                 Long[]  ids={  sysDictType.getDictId()};
                 data.put("data", ids);
                 //手动转json
                 String jsonStr=JSONUtil.toJsonStr(data);
                 //发送消息给队列
                 this.sendMessage(jsonStr);
             }else{
                 // 判断当前状态 state=0  如果数据库=1，读取sys_dict_data相关的值，加载到redis中
                 if(dbDict.getStatus().equals("1")){
                     data.put("operation","update");
                     data.put("dictId", dbDict.getDictId());
                     data.put("dictType", dbDict.getDictType());
                     //手动转json
                     String jsonStr=JSONUtil.toJsonStr(data);
                     //发送消息给队列
                     this.sendMessage(jsonStr);
                 }
             }
         }
        return  result;
    }

    @Override
    public boolean addDict(SysDictType sysDictType) {
        boolean result=this.save(sysDictType);
        //同步数据，
        Map<String,Object> data=new HashMap<>();
        data.put("operation","insert");
        data.put("dictType", sysDictType.getDictType());
        //手动转json
        String jsonStr=JSONUtil.toJsonStr(data);
        //发送消息给队列
        this.sendMessage(jsonStr);

        return result;
    }

    /**
     * 生产者发送消息给队列
     * @param jsonStr
     */
    private void sendMessage(String jsonStr){
        //如果数据格式是json，就必须使用 二进制流的格式来传递,不能使用jackson或 fastjson,默我们有数据脱敏
//        Message  message=new Message( jsonStr.getBytes(StandardCharsets.UTF_8));
//        // 异步，解耦
//        this.rabbitTemplate.convertAndSend(RabbitMQConst.REDIS_DICT_QUEUE,message);
    }
}
